<?php
/**
 * 日志
 *
 * PHP Version 5.6
 *
 * @category PHP
 * @package  TPLogger
 * @author   ctwj <908504609@qq.com>
 * @license  MIT https://github.com/ctwj/wechat_search/blob/master/LICENSE
 * @link     https://github.com/ctwj/wechat_search/
 * @date     2018-05-13 22:56:47
 * @modifyby ctwj
 */

namespace Telegram;

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\ErrorLogHandler;

/**
 * Telegram Post Logger class
 *
 * @category PHP
 * @package  Logger
 * @author   ctwj <908504609@qq.com>
 * @license  MIT https://github.com/ctwj/wechat_search/blob/master/LICENSE
 * @link     https://github.com/ctwj/wechat_search/
 */
class TPLogger
{
    /**
     * Monolog Instance
     *
     * @var Monolog\Logger;
     */
    public $log;
    /**
     * Debug
     *
     * @var [boolean]
     */
    public $debug;

    /**
     * Construct function
     *
     * @param [string]  $savePath 日志存储路径
     * @param [boolean] $debug    是否开启调试
     *
     * @return void
     */
    public function __construct($savePath, $debug)
    {
        $filename = date('Ymd', time()).'.log';
        $this->debug = $debug;
        $this->log = new Logger('name');
        $this->log->pushHandler(new StreamHandler($savePath.DS.$filename/*, Logger::WARNING*/));

        /**
         * 如果命令在控制台运行，日志同时输出到控制台
         */
        if (CLI) {
            $this->log->pushHandler(new \Monolog\Handler\ErrorLogHandler());
        }

        // 添加处理调试的路径处理器
        $this->log->pushProcessor(
            function ($record) {
                /**
                 * 记录记录日志的位置, info日志不记录位置
                 */
                $trace = debug_backtrace();
                $trac_count = count($trace);
                $index = -1;
                for ($i = 0; $i < $trac_count; $i++) {
                    if (!isset($trace[$i]['file'])) {
                        continue;
                    }
                    if (basename($trace[$i]['file']) == 'TPLogger.php') {
                        $index = $i + 1;
                        break;
                    }
                }
                if ($index > 0 && $record['level'] != 200) {
                    $record['extra'] = [
                        'file'  => str_replace(SRC_ROOT, '', $trace[$index]['file']),
                        'line'  => $trace[$index]['line'],
                    ];
                }
                return $record;
            }
        );
    }

    /**
     * 日志函数调用
     *
     * @param [string] $method 日志方法
     * @param [array]  $args   传递的参数
     *
     * @return void
     */
    public function __call($method, $args)
    {
        /**
         * 生产环境不记录调试信息
         */
        if ($this->debug && $method == 'debug') {
            return;
        }
        $param1 = (isset($args[1]) && !\is_null($args[1])) ? $args[1] : [];
        $this->log->$method($args[0], $param1);
    }
}
